package mongodb;

import com.mongodb.BasicDBObject;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientOptions;
import com.mongodb.util.JSON;


/**
 * 实现了连接池,默认初始化10个连接
 * MongoClient对象是线程安全的,因此可以只创建一个,在多线程环境下安全使用
 * 另外注意,close方法将关闭当前所有活跃的连接,所以应该在确定不再使用时候才关闭
 */
public class MongoTest {

	public static void main(String[] args) {
		MongoClientOptions mcs = MongoClientOptions.builder().connectionsPerHost(6).connectTimeout(1000).build();
		
		MongoClient mongo = new MongoClient("localhost",mcs);
		
		int connectionsPerHost = mongo.getMongoClientOptions().getConnectionsPerHost();
		
		System.out.println(connectionsPerHost);
		
		//用完后对归还连接池
		DB  db = mongo.getDB("admin");
		
		DBCollection users = db.getCollection("users");
		/**
		 * 添加:方式1
		 */
//		BasicDBObject d1 = new BasicDBObject();
//		d1.append("userId", "myu2").append("userId", "myu3");
//		users.insert(d1);
		
		/**
		 * 方式2
		 */
//		BasicDBObjectBuilder builder = BasicDBObjectBuilder.start().
//				add("userId", "u4").add("age", 12);
//		users.insert(builder.get());
		
		/**
		 * 方式3
		 */
//		Map<String, Object> data = new HashMap<>();
//		data.put("userId", "u5");
//		users.insert(new BasicDBObject(data));
		
		/**
		 * 方式4
		 */
//		String json = "{'userId':'u6','name':'majie'}";
//		DBObject data2 = (DBObject) JSON.parse(json);
//		users.insert(data2);
		
		/**
		 * 删除,根据条件删除
		 */
//		users.remove(new BasicDBObject("userId", "u3"));
		/**
		 * 全部删除
		 */
//		users.remove(new BasicDBObject());
		
		/**
		 * 修改
		 * 第一个参数:要修改的
		 * 第二个:修改以后
		 */
//		users.update(new BasicDBObject("userId","u6"), d1);
		
		/**
		 * 修改,基本和命令行一样.大括号等价于BasicDBObject
		 * 第一个参数:要修改的
		 * 第二个:修改以后
		 */
//		users.update(new BasicDBObject("userId","myu3"), 
//				new BasicDBObject("$set",
//						new BasicDBObject("name","newName")));
		
		/**
		 * 查询一条
		 */
//		DBObject findOne = users.findOne();
//		System.out.println(findOne);
		/**
		 * 查询全部
		 */
//		DBCursor find = users.find();
		
		
		
		
		/**
		 * 按条件查询
		 */
//		DBObject con = new BasicDBObject("userId","myu3");
		
		/**
		 * 查询条件 年龄在10-20
		 */
//		DBObject con = new BasicDBObject(
//				"age",new BasicDBObject("$gt",10).append("$lt", 20));
		
		//查询条件{userId:"u4",age:{$gte:10,$lt:20}}
		DBObject con = new BasicDBObject(
				"userId","u4").append(
				"age",new BasicDBObject("$gt",10).append("$lt", 20));
		
		//limit用于限制返回条数.但是0不起作用
//		DBCursor find = users.find(con).limit(1);
		//排序 -1 降序
//		DBCursor find = users.find(con).sort(new BasicDBObject("userId",-1));
		//分页
//		DBCursor find = users.find().sort(new BasicDBObject("userId",-1)).skip(1).limit(2);
		
		//约束要返回的字段
		DBObject show = new BasicDBObject("userId",1).append("age", 1).append("_id", 0);
		DBCursor find = users.find(con,show).limit(2);
		while(find.hasNext()){
			DBObject next = find.next();
			System.out.println(next);
		}
		
		mongo.close();
	}
	
}
